AWS System Managerセッションマネージャーがリモートホストのポートフォワードに対応しました
AWS System Managerセッションマネージャーはポートフォワードに対応しており、セキュリティグループで特定のポートをあけることなく、プライベートサブネットのWindowsサーバーにRDPするといったことが可能です。
従来は、セッション接続先のEC2インスタンス内で LISTEN しているポートしかフォワードできませんでしたが、今回のアップデートにより、リモートホストのポートも転送できるようになりました。
より具体的には、EC2インスタンスを踏み台に、VPC内のリソース、例えばRDSのホスト・ポートを転送するといったことが可能になりました。
やってみた
SSM エージェントバージョンを確認
AWS Systems Managerは操作対象のインスタンスにエージェントをインストールします。
Session Managerを利用したリモートホスト・ポートフォワードの場合、バージョン 3.1.1374.0 以上が必要です。
エージェントのバージョンが古いままの場合、新しいバージョンにアップデートしましょう。
シンプルなSSMシェルアクセス
EC2インスタンスにSSMセッションマネージャーでシェルアクセスする場合、アクセス先のインスタンスIDを指定するだけです。
$ aws ssm start-session \ --target i-123 ... sh-4.2$
SSMでローカルホストのポートを転送
セッション接続先インスタンス内のポートを転送する場合、この引数にプラスして
- ポートフォワード用ドキュメント(
AWS-StartPortForwardingSession
) - EC2インスタンス内のポート・ローカルのポート
指定します。
例えば、EC2インスタンス内の MySQLのポートを転送する場合、以下の通りです。
$ aws ssm start-session \ --target i-123 \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["3306"], "localPortNumber":["3306"]}'
クライアントからは、localhostの3306ポートに接続します。
$ mysql -u admin -p -h localhost -P 3306
[NEW]SSMでリモートホストのポートを転送
今回発表になったリモートホストのポートを転送する場合、ドキュメントをリモートホスト用のものに変更し、パラメーターでリモートのホスト名も指定します。
- リモートホストのポートフォワード用ドキュメント(
AWS-StartPortForwardingSessionToRemoteHost
) - リモートのホスト・ポート、ローカルのポート
例えば、RDS MySQL のホスト・ポートをローカルの同じポートに転送する場合、以下の通りです。
$ aws ssm start-session \ --target i-123 \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["aaa.bbb.ap-northeast-1.rds.amazonaws.com"],"portNumber":["3306"], "localPortNumber":["3306"]}'
クライアントからは、localhostの3306ポートに接続します。
$ mysql -u admin -p -h localhost -P 3306
SSMポートフォワードのメリット
SSM方式のポートフォワードには、様々なメリットがあります。
- IAMで認証・認可可能
- 踏み台サーバーはプライベートサブネットに設置可能
- セキュリティグループのインバウンドルールでSSHやRDPなどを許可しなくて良い
- クライアントからのアウトバウンドはHTTPS通信。SSHやRDPのアウトバウンド通信が禁止されている環境でも利用可能
など枚挙にいとまがありません。
最後に
AWS Systems Manager セッションマネージャーがリモートホストのポートも転送できるようになり、EC2を踏み台に、RDS・ElastiCacheなど、様々なVPCリソースにVPC外から通信できるようになりました。
より複雑なポートフォワードを行いたい場合、SSH over SSM をご検討ください。
それでは。